10d3140d7b1ffdd204e243de0af27d5d9a676861,src/com/linkedin/parseq/Task.java,Task,recoverWith,#String#Function1#,712
Before Change
default Task<T> recoverWith(final String desc, final Function1<Throwable, Task<T>> func) {
ArgumentUtil.requireNotNull(func, "function");
final Task<T> that = this;
return async(desc, context -> {
final SettablePromise<T> result = Promises.settable();
final Task<T> recovery = async("recovery", ctx -> {
final SettablePromise<T> recoveryResult = Promises.settable();
if (that.isFailed()) {
if (!(Exceptions.isCancellation(that.getError()))) {
try {
Task<T> r = func.apply(that.getError());
Promises.propagateResult(r, recoveryResult);
ctx.run(r);
} catch (Throwable t) {
recoveryResult.fail(t);
}
} else {
recoveryResult.fail(that.getError());
}
} else {
recoveryResult.done(that.get());
}
return recoveryResult;
});
recovery.getShallowTraceBuilder().setSystemHidden(true);
Promises.propagateResult(recovery, result);
context.after(that).run(recovery);
context.run(that);
return result;
});
}
/**
After Change
default Task<T> recoverWith(final String desc, final Function1<Throwable, Task<T>> func) {
ArgumentUtil.requireNotNull(func, "function");
final Task<T> that = this;
Task<T> recoverWithTask = async(desc, context -> {
final SettablePromise<T> result = Promises.settable();
final Task<T> recovery = async("recovery", ctx -> {
final SettablePromise<T> recoveryResult = Promises.settable();
if (that.isFailed()) {
if (!(Exceptions.isCancellation(that.getError()))) {
try {
Task<T> r = func.apply(that.getError());
Promises.propagateResult(r, recoveryResult);
ctx.run(r);
} catch (Throwable t) {
recoveryResult.fail(t);
}
} else {
recoveryResult.fail(that.getError());
}
} else {
recoveryResult.done(that.get());
}
return recoveryResult;
});
recovery.getShallowTraceBuilder().setSystemHidden(true);
recovery.getShallowTraceBuilder().setTaskType(TaskType.RECOVER.getName());
Promises.propagateResult(recovery, result);
context.after(that).run(recovery);
context.run(that);
return result;
});
recoverWithTask.getShallowTraceBuilder().setTaskType(TaskType.WITH_RECOVER.getName());
return recoverWithTask;
}
/**